#!/bin/bash

# 详细调试脚本

echo "=== 详细调试 moparse ==="

# 进入modb目录
cd /home/apachee/trunk/Crystal/CrystalFlowAnalyzer/modb

# 设置环境变量
export PROJ_ROOT=/home/apachee/trunk/Crystal/CrystalFlowAnalyzer/a9soc

echo "环境变量 PROJ_ROOT 设置为: $PROJ_ROOT"

# 验证环境变量是否正确设置
if [ -z "$PROJ_ROOT" ]; then
    echo "错误: PROJ_ROOT 环境变量未设置"
    exit 1
fi

# 验证文件列表是否存在
FILELIST="/home/apachee/trunk/Crystal/CrystalFlowAnalyzer/a9soc/design/usb2/src/DWC_usb3.lst"
if [ ! -f "$FILELIST" ]; then
    echo "错误: 文件列表 $FILELIST 不存在"
    exit 1
fi

echo "文件列表存在，路径: $FILELIST"

# 显示文件列表的前20行
echo "=== 文件列表前20行 ==="
head -20 "$FILELIST"

# 创建一个只包含前5个文件的小型测试列表
echo "=== 创建小型测试列表 ==="
echo "# 小型测试列表" > small_test.list
head -8 "$FILELIST" | grep -v "^#" | grep -v "^//" | grep -v "^$" >> small_test.list

echo "小型测试列表内容:"
cat small_test.list

# 逐个检查文件是否存在
echo "=== 检查文件存在性 ==="
line_num=0
while IFS= read -r line; do
    line_num=$((line_num + 1))
    # 跳过注释和空行
    if [[ $line == \#* ]] || [[ $line == //* ]] || [[ -z $line ]]; then
        continue
    fi
    
    # 解析环境变量
    resolved_line=$(echo "$line" | sed "s/\$PROJ_ROOT/$PROJ_ROOT/g")
    echo "检查文件 $line_num: $resolved_line"
    
    if [ -f "$resolved_line" ]; then
        echo "  ✓ 文件存在"
    else
        echo "  ✗ 文件不存在"
    fi
done < small_test.list

# 使用gdb调试运行（如果可用）
echo "=== 尝试使用gdb调试 ==="
if command -v gdb &> /dev/null; then
    echo "gdb可用，开始调试..."
    echo "运行以下命令进行调试:"
    echo "gdb --args ./moparse -f small_test.list -o small_test.modb"
    echo ""
    echo "在gdb中使用以下命令:"
    echo "(gdb) run"
    echo "(gdb) bt  # 如果崩溃，显示调用栈"
else
    echo "gdb不可用，使用普通方式运行"
    
    # 普通运行方式
    echo "=== 普通运行测试 ==="
    echo "运行命令: ./moparse -f small_test.list -o small_test.modb"
    
    # 捕获输出和错误
    ./moparse -f small_test.list -o small_test.modb 2>&1
    
    # 检查返回码
    if [ $? -eq 0 ]; then
        echo "命令执行成功"
        if [ -f "small_test.modb" ]; then
            echo "✓ 成功生成modb文件"
            ls -la small_test.modb
        else
            echo "✗ 未生成modb文件"
        fi
    else
        echo "✗ 命令执行失败"
    fi
fi

# 清理测试文件
echo "=== 清理 ==="
rm -f small_test.list

echo "=== 调试完成 ==="